// H5发起请求（账号密码发送）
//  --> 后台程序收到账号密码之后，进行校验账号密码是否匹配
//  --> 如果匹配颁发token（通行证），通过接口返回给前端
//    --> 前端收到token之后，存储到本地存储中
//      --> 后续的网络请求，自动带上token（通行证），
//          后台对token进行校验，通过后允许访问数据

// H5发起请求：axios.post('/login', {username: '', password: ''})

// 后台程序校验账号密码【JSON-server中间件（Node.js程序，可以使用Express的变量）】
// 后台程序颁发token【JSON-server中间件，jsonwebtoken.sign】

// H5收到返回的数据，token存localStorage：localStorage.setItem(key, value)
// 每次发送网络请求带上token：【axios二次封装，全局请求拦截中】

// 后台对token进行校验【JSON-server中间件，jsonwebtoken.verify】

// 使用：json-server -w db.json -m auth.js

const jwt = require("jsonwebtoken")
// 基于Nodejs的规范，对外暴露出当前模块，供外部使用
module.exports = (req, res, next) => {
  // Node.js环境！！！
  // req：request，代表了前端发过来的一个请求
  if (req.method == "POST" && req.path == "/login") {
    // 结构req.body：来自于H5发送的ajax请求携带的参数
    const { username, password } = req.body
    console.log(username, password)

    // 对账号密码是否匹配做校验
    // 更正规的校验，是从数据库中获取账号密码信息做匹配的校验
    if (username == "zhangsan" && password == "123456") {
      // 校验通过，生成token，返回给前端
      let token = jwt.sign({ username }, "2302B")
      console.log(token)
      return res.status(200).json({
        success: true,
        data: {
          token,
        },
      })
    } else {
      // 表明是登录接口
      // res：response，返回，网络请求返回给前端的内容
      return res.status(200).json({
        success: false,
        data: {},
      })
    }
  }
  const token = req.headers["token"]
  try {
    const decoded = jwt.verify(token, "2302B")
    console.log("解密token得到一个对象：", decoded)
  } catch (e) {
    return res.status(200).json({
      success: false,
      msg: "token已失效",
    })
  }
  // 所有的网络请求，都会被中间件拦截，在当前函数处理
  // 处理完成之后，把控制权往下传递
  next() // 不要忘记调用next！！！
}
